home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 August / MW 8 2003 CD1.iso / Inside Macworld / Product News / gimp-1.2.4.sit / gimp-1.2.4 / plug-ins / perl / examples / blowinout < prev    next >
Encoding:
Text File  |  2000-05-21  |  3.7 KB  |  113 lines

  1. #!/usr/app/bin/perl
  2.  
  3. eval 'exec /usr/app/bin/perl  -S $0 ${1+"$@"}'
  4.     if 0; # not running under some shell
  5.  
  6. # Blow In/Out
  7. # John Pitney
  8.  
  9. use Gimp qw(:auto __ N_);
  10. use Gimp::Fu;
  11.  
  12. # print "hello there\n";
  13.  
  14. # Gimp::set_trace(TRACE_CALL);
  15.  
  16.  
  17. sub blowinout {
  18.     my ($img, $drawable, $angle, $nsteps, $distance, $inmode, $arithmode) = @_;
  19.     # bail out if $drawable isn't a layer
  20. #    print "Starting\n";
  21.     if( gimp_selection_is_empty($img) == 0) { return };
  22. #    if ($nsteps == 0) return;
  23.     eval { $img->undo_push_group_start };
  24.     # save the background color for later restoration
  25.     my $oldbg = gimp_palette_get_background();
  26.     #get the drawable dimensions
  27.     my $xsize = gimp_drawable_width($drawable);
  28.     my $ysize = gimp_drawable_height($drawable);
  29.  
  30.     # Set background color to 128, for clearing dm
  31.     gimp_palette_set_background([128,128,128]);
  32.  
  33.     # Create a grayscale workspace image for displacement map
  34.     my $dm = gimp_image_new($xsize, $ysize, 1);
  35.     eval { $dm->undo_push_group_start };
  36.     # It needs to have 2 layers
  37.     my $dmlayer = gimp_layer_new($dm, $xsize, $ysize, GRAY_IMAGE, "newlayer",
  38.         100, NORMAL_MODE);
  39.     gimp_image_add_layer($dm, $dmlayer, 0);
  40.  
  41.     # Create the layers, one-by-one
  42.     my $i = 1;
  43.     my $xdist = ($arithmode) ?
  44.         $i * $distance / $nsteps * -cos($angle * 3.14159 / 180) :
  45.         $distance ** ($i/$nsteps) * -cos($angle * 3.14159 / 180);
  46.     my $ydist = ($arithmode) ?
  47.         $i * $distance / $nsteps * sin($angle * 3.14159 / 180) :
  48.         $distance ** ($i/$nsteps) * sin($angle * 3.14159 / 180);
  49.     gimp_edit_clear($dmlayer);
  50.     plug_in_noisify($dm, $dmlayer, 0, 255, 255, 255, 0);
  51.     gimp_levels($dmlayer, 0, 0, 255, 1.0, 128, 255);
  52.     $drawable = gimp_layer_copy($drawable, 0);
  53.     gimp_image_add_layer($img, $drawable, -1);
  54.     plug_in_displace($img, $drawable, $xdist, $ydist, 1, 1, $dmlayer,
  55.         $dmlayer, 1);
  56.     if ( $inmode == 1 )
  57.     {
  58.         gimp_image_lower_layer($img, $drawable);
  59.     };
  60.     for ( $i = 2; $i <= $nsteps; $i++ ) {
  61.         $xdist = ($arithmode) ?
  62.             $i * $distance / $nsteps * -cos($angle * 3.14159 / 180) :
  63.             $distance ** ($i/$nsteps) * -cos($angle * 3.14159 / 180);
  64.         $ydist = ($arithmode) ?
  65.             $i * $distance / $nsteps * sin($angle * 3.14159 / 180) :
  66.             $distance ** ($i/$nsteps) * sin($angle * 3.14159 / 180);
  67.         gimp_edit_clear($dmlayer);
  68.         plug_in_noisify($dm, $dmlayer, 0, 255, 255, 255, 0);
  69.         gimp_levels($dmlayer, 0, 0, 255, 1.0, 128, 255);
  70.         $drawable = gimp_layer_copy($drawable, 0);
  71.         gimp_image_add_layer($img, $drawable, -1);
  72.         plug_in_displace($img, $drawable, $xdist, $ydist, 1, 1, $dmlayer,
  73.             $dmlayer, 1);
  74.         if ( $inmode == 1 )
  75.         {
  76.             gimp_image_lower_layer($img, $drawable);
  77.         };
  78.     }
  79.  
  80.     eval { $dm->undo_push_group_end };
  81. #    gimp_image_remove_layer($dm, $dmlayer);
  82. #    gimp_image_delete ($dm);
  83.     gimp_palette_set_background($oldbg);
  84.     eval { $img->undo_push_group_end };
  85. #    gimp_displays_flush(); unneccessary (and dangerous ;)
  86.  
  87.     (); # I like smileys ;)
  88. }
  89.  
  90. register
  91.     "blowinout",
  92.     "Blow selected layer inout",
  93.     "Generates an animation thats blows the selected layer in or out",
  94.     "John Pitney",
  95.     "John Pitney <pitney\@uiuc.edu>",
  96.     "1999-03-15",
  97.     N_"<Image>/Filters/Animation/BlowInOut...",
  98.     "*",
  99.     [
  100.      [PF_INT32, "angle", "Wind Angle, 0 is left", 120],
  101.          [PF_INT32, "steps", "Number of Steps/Layers", 5],
  102.      [PF_VALUE, "distance", "How far to blow",30],
  103. # What I really need here are radio buttons!  Maybe they even exist...
  104. # You wanted them...
  105.      [PF_RADIO, "direction", "Blow direction", 0, [In => 1, Out => 0]],
  106.          [PF_RADIO, "series", "Kind of series", 1, [Arithmetic => 1, Geometric => 0]]
  107.     ],
  108.         [],
  109.     \&blowinout;
  110.  
  111. exit main;
  112.  
  113.